package com.chase.framerwork.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * json工具类,json转换成Bean和Map
 * 
 * @Author Chase
 * @Date 2013-10-22
 */
public class JSONUtil
{

	/**
	 * JSON对象转Bean
	 * 
	 * @param json
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T json2Bean(JSONObject json, Class<T> clazz)
	{
		T t = (T) JSONObject.toBean(json, clazz);

		return t;
	}

	/**
	 * JSON格式字符串转Bean
	 * 
	 * @param jsonData
	 * @param clazz
	 * @return
	 */
	public static <T> T json2Bean(String jsonData, Class<T> clazz)
	{

		JSONObject json = JSONObject.fromObject(jsonData);

		T t = json2Bean(json, clazz);

		return t;
	}

	/**
	 * JSON对象转Map
	 * 
	 * @param json
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> json2Map(JSONObject json)
	{
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		// 最外层解析
		for (Object key : json.keySet())
		{
			Object value = json.get(key);
			// 如果内层还是数组的话，继续解析
			if (value instanceof JSONArray)
			{
				List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
				Iterator<JSONObject> iterator = ((JSONArray) value).iterator();
				while (iterator.hasNext())
				{
					json = iterator.next();
					list.add(json2Map(json.toString()));
				}
				map.put(key.toString(), list);
			}
			else
			{
				map.put(key.toString(), value);
			}
		}
		return map;
	}

	/**
	 * JSON格式的字符串转Map
	 * 
	 * @param jsonData
	 * @return
	 */
	public static Map<String, Object> json2Map(String jsonData)
	{
		JSONObject json = JSONObject.fromObject(jsonData);

		return json2Map(json);
	}

	/**
	 * JSON格式字符串转List
	 * 
	 * @param jsonData
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List<Map<String, Object>> json2List(String jsonData)
	{
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		JSONArray jsonArr = JSONArray.fromObject(jsonData);
		Iterator<JSONObject> it = jsonArr.iterator();
		while (it.hasNext())
		{
			JSONObject json = it.next();
			list.add(json2Map(json.toString()));
		}
		return list;
	}
}
